package br.org.universa.sgos.entidade;

import java.util.Calendar;
import java.util.List;

import javax.persistence.AssociationOverride;
import javax.persistence.AssociationOverrides;
import javax.persistence.AttributeOverride;
import javax.persistence.AttributeOverrides;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import br.org.universa.sgos.enums.IndisponibilidadeEnum;
import br.org.universa.sgos.enums.NivelDeCriticidadeEnum;
import br.org.universa.sgos.enums.StatusIncidenteEnum;

@Entity
@Table(name = "INC_INCIDENTE")
@AttributeOverrides({
    @AttributeOverride(name="id", column=@Column(name="INC_ID")),
    @AttributeOverride(name="nivelDeUrgencia", column=@Column(name="INC_NIVEL_URGENCIA")),
    @AttributeOverride(name="dataHoraAbertura", column=@Column(name="INC_DH_ABERTURA")),
    @AttributeOverride(name="dataHoraFechamento", column=@Column(name="INC_DH_FECHAMENTO"))
})
@AssociationOverrides({
    @AssociationOverride(name = "categoria", joinColumns = @JoinColumn(name = "INC_CATEGORIA_ASSOCIADA", nullable = false)),
    @AssociationOverride(name = "agenteIniciador", joinColumns = @JoinColumn(name = "INC_AGENTE_INICIADOR", nullable = false)),
    @AssociationOverride(name = "agenteResponsavel", joinColumns = @JoinColumn(name = "INC_AGENTE_RESPONSAVEL"))
})
public class RegistroIncidente extends Registro {

    @Column(name = "INC_PROTOCOLO")
    private String protocolo;

    @Column(name = "INC_NIVEL_CRITICIDADE")
    @Enumerated(EnumType.STRING)
    private NivelDeCriticidadeEnum nivelDeCriticidade;

	@Column(name = "INC_DESCRICAO")
    private String descricao;

    @Column(name = "INC_STATUS")
    @Enumerated(EnumType.STRING)
    private StatusIncidenteEnum status;

    @Column(name = "INC_DATA_OCORRENCIA")
    @Temporal(value = TemporalType.DATE)
    private Calendar dataPrevistaAbertura;

    @Column(name = "INC_HORARIO_OCORRENCIA")
    @Temporal(value = TemporalType.TIMESTAMP)
    private Calendar dataPrevistaFechamento;

    @Column(name = "INC_INDISPONIBILIDADE")
    @Enumerated(EnumType.STRING)
    private IndisponibilidadeEnum indisponibilidade;

    @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinTable(
            name="INC_ICO_REL",
            joinColumns={@JoinColumn(name="INC_ID_REL", referencedColumnName="INC_ID")},
            inverseJoinColumns={@JoinColumn(name="ICO_ID_REL", referencedColumnName="ICO_ID")})
    private List<ItemDeConfiguracao> itensAfetados;

    public String getProtocolo() {
        return protocolo;
    }

    public void setProtocolo(String protocolo) {
        this.protocolo = protocolo;
    }

    public NivelDeCriticidadeEnum getNivelDeCriticidade() {
		return nivelDeCriticidade;
	}

	public void setNivelDeCriticidade(NivelDeCriticidadeEnum nivelDeCriticidade) {
		this.nivelDeCriticidade = nivelDeCriticidade;
	}

    public String getDescricao() {
        return descricao;
    }

    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }

    public StatusIncidenteEnum getStatus() {
        return status;
    }

    public void setStatus(StatusIncidenteEnum status) {
        this.status = status;
    }

	public Calendar getDataPrevistaAbertura() {
		return dataPrevistaAbertura;
	}

	public void setDataPrevistaAbertura(Calendar dataPrevistaAbertura) {
		this.dataPrevistaAbertura = dataPrevistaAbertura;
	}

	public Calendar getDataPrevistaFechamento() {
		return dataPrevistaFechamento;
	}

	public void setDataPrevistaFechamento(Calendar dataPrevistaFechamento) {
		this.dataPrevistaFechamento = dataPrevistaFechamento;
	}

	public IndisponibilidadeEnum getIndisponibilidade() {
		return indisponibilidade;
	}

	public void setIndisponibilidade(IndisponibilidadeEnum indisponibilidade) {
		this.indisponibilidade = indisponibilidade;
	}

    public List<ItemDeConfiguracao> getItensAfetados() {
        return itensAfetados;
    }

    public void setItensAfetados(List<ItemDeConfiguracao> itensAfetados) {
        this.itensAfetados = itensAfetados;
    }

}
